package com.navinfo.platform;

import lombok.Data;
import lombok.ToString;

import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.io.*;
import java.util.*;
import java.util.stream.Collectors;

/***
 * 计算瓦片与省市的对应关系
 * 主要计算15级的瓦片
 */
public class RepairFiles {

    public static double x_PI = 3.14159265358979324 * 3000.0 / 180.0;
    public static double PI = 3.1415926535897932384626;
    public static double a = 6378245.0;
    public static double ee = 0.00669342162296594323;

    public static void main(String[] args) throws IOException {
        //某个市经纬度边界的文件路径
        String path = "E:\\data\\000010_0_copy_8";
        OutputStream os = new FileOutputStream(new File(path),true);
        byte[] data = new byte[]{80, 65, 82, 49};
        os.write(data,0, data.length);
        os.flush();//强制刷新出去
        os.close();
    }

    /**
     * 百度坐标系 (BD-09) 与 火星坐标系 (WGS84)的转换
     * 即 百度 转 谷歌、高德
     * @param bd_lon
     * @param bd_lat
     * @returns {*[]}
     */
    public static Point bd09togcj02(double bd_lon, double bd_lat){
        double x = bd_lon - 0.0065;
        double y = bd_lat - 0.006;
        double z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * x_PI);
        double theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * x_PI);
        double gg_lng = z * Math.cos(theta);
        double gg_lat = z * Math.sin(theta);

        double lng = gg_lng;
        double lat = gg_lat;
        double dlat = transformlat(lng - 105.0, lat - 35.0);
        double dlng = transformlng(lng - 105.0, lat - 35.0);
        double radlat = lat / 180.0 * PI;
        double magic = Math.sin(radlat);
        magic = 1 - ee * magic * magic;
        double sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI);
        dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI);
        double mglat = lat + dlat;
        double mglng = lng + dlng;

        Point point=new Point(mglng, mglat);
        return point;
    }


    private  static double transformlat(double lng,double lat){
        double ret= -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0;
        ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0;
        return ret;
    }

    private static double transformlng(double lng,double lat){
        double ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng));
        ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0;
        ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0;
        ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0;
        return ret;
    }

    @Data
    public static class Point {

        public Point(double lng, double lat){
            this.lng = lng;
            this.lat = lat;
        }
        double lng;
        double lat;
    }

    @Data
    @ToString
    public static class Coordinate {

        public Coordinate(){}
        public Coordinate(int x, int y){
            this.x = x;
            this.y = y;
        }
        private int x;
        private int y;

    }
}
